package principal;

import netgames.JogadaTetris;

public class GerenciadorTetramino {

	protected Tetramino proximoTetramino;
	protected int proximaOrientacao;
	protected Tetramino tetraminoDaVez;
	protected int orientacaoDaVez;
	protected Tetris tetris;
	
	public GerenciadorTetramino(Tetris tet){
		tetris = tet;
	}

	public Tetramino getTetraminoDaVez() {
		return this.tetraminoDaVez;
	}

	public void setTetraminoDaVez(Tetramino tetraminoDaVez) {
		this.tetraminoDaVez = tetraminoDaVez;
		quedaTetramino();
	}
	
	public Tetramino getProxTetramino() {
		return this.proximoTetramino;
	}
	
	public void setProximoTetramino(Tetramino proximoTetramino) {
		this.proximoTetramino = proximoTetramino;
	}
	
	public void criaTetraminoPreview(Jogador jogDaVez){
		tetris.getPreview().resetArea();
		Tetramino tetramino = new Tetramino(tetris.getPreview().getQuadrado(1, 1), tetris.getPreview(), jogDaVez);
		this.setProximoTetramino(tetramino);
		tetris.getPreview().repaint();
	}
	
	public void criaTetraminoDaVez(Jogador jogDaVez){
		tetris.getTabuleiro().resetArea();
		Tetramino tetramino = new Tetramino(tetris.getTabuleiro().getQuadrado(1, 4), tetris.getTabuleiro(), jogDaVez);
		this.setTetraminoDaVez(tetramino);
		tetris.getTabuleiro().repaint();
	}
	
	public void initTetraminos(Jogador jogDaVez){
		criaTetraminoPreview(jogDaVez);
		criaTetraminoDaVez(jogDaVez);
	}

	public void atualizarTetraminos(Jogador jogDaVez){
		if(proximoTetramino !=null){
			proximoTetramino.apagarAntigos();
			tetraminoDaVez = proximoTetramino;
			tetraminoDaVez.setMatriz(tetris.getTabuleiro());
			if(!tetris.getTabuleiro().getQuadrado(1, 4).getOcupado()){
				tetraminoDaVez.setQuadradoReferencia(tetris.getTabuleiro().getQuadrado(1, 4));
			}else{
				tetris.notificaVencedor((int)tetraminoDaVez.getQuadradoReferencia().getReferencia().getY(), true);
			}
			criaTetraminoPreview(jogDaVez); 
		}
	}
	
	public void recebeTetramino(Jogador jogDaVez){
		atualizarTetraminos(jogDaVez);
		quedaTetramino();
	}
	
	public void quedaTetramino(){
		Thread t = new PeriodicChecker();
	    t.start();
	}
	
	public class PeriodicChecker extends Thread
	{
	    @Override
	    public void run()
	    {
	    	if(tetraminoDaVez != null){
	    		boolean emQueda = tetraminoDaVez.acelerarQueda();
	    		while(emQueda) {
	    			try {
	    				Thread.sleep(1000);
	    				if(tetraminoDaVez != null){
	    					emQueda = tetraminoDaVez.acelerarQueda();
	    				}
	    			} catch (InterruptedException e) {
	    				e.printStackTrace();
	    			}
	    		}
	    		if(!emQueda){
	    			tetris.verificaSeAlgumaLinhaEstaCompleta();
	    			
	    			
	    			JogadaTetris jog = new JogadaTetris(tetraminoDaVez, 1);
	    			tetris.enviarJogada(jog);
	    			if(tetris.getJogador1().getDaVez()){
	    				tetris.getJogador1().setDaVez(false);
	    				tetris.getJogador2().setDaVez(true);
	    			}else{
	    				tetris.getJogador2().setDaVez(false);
	    				tetris.getJogador1().setDaVez(true);
	    			}
	    		}
	    	}
	    	Jogador jog;
	    	if(tetris.getJogador1().getDaVez()){
	    		jog = tetris.getJogador1();
	    	}else{
	    		jog = tetris.getJogador2();
	    	}
	    	atualizarTetraminos(jog);
    		interrupt();
	    }
	}
	
	
	
}